layout.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import Box from "@/components/Box";
  2. import Header from "@/components/Header";
  3. import { getTranslations } from "next-intl/server";
  4. import { FC, PropsWithChildren, ReactNode, Suspense } from "react";
  5. import DownloadSection from "./_home/DownloadSection";
  6. import { GroupType } from "@/api/home";
  7. import {
  8. NoticePlaceHolder,
  9. PrizePlaceHolder,
  10. SwiperPlaceHolder,
  11. } from "@/app/[locale]/(TabBar)/[[...share]]/Placeholder";
  12. import { server } from "@/utils/server";
  13. const TIME = 0;
  14. const getGames = async () => {
  15. return server
  16. .request<GroupType[]>({
  17. url: "/v1/api/front/game_list",
  18. method: "POST",
  19. next: { revalidate: TIME },
  20. })
  21. .then((res) => {
  22. if (res.code === 200) return res.data;
  23. return [];
  24. });
  25. };
  26. export const generateMetadata = async () => {
  27. const t = await getTranslations("titles");
  28. return {
  29. title: t("home"),
  30. };
  31. };
  32. type Props = {
  33. clientWidget: ReactNode;
  34. swiperWidget: ReactNode;
  35. popupWidget: ReactNode;
  36. cardWidget: ReactNode;
  37. noticeWidget: ReactNode;
  38. searchWidget: ReactNode;
  39. prizeWidget: ReactNode;
  40. actionWidget: ReactNode;
  41. mediaWidget: ReactNode;
  42. sportSwiperWidget: ReactNode;
  43. categoryWidget: ReactNode;
  44. group: any;
  45. };
  46. const Placeholder = () => {
  47. return <div className={"flex justify-center"}>{/*<Loading/>*/}</div>;
  48. };
  49. const Layout: FC<PropsWithChildren<Props>> = async (props) => {
  50. const {
  51. children,
  52. swiperWidget,
  53. popupWidget,
  54. cardWidget,
  55. noticeWidget,
  56. searchWidget,
  57. prizeWidget,
  58. actionWidget,
  59. mediaWidget,
  60. sportSwiperWidget,
  61. clientWidget,
  62. categoryWidget,
  63. } = props;
  64. return (
  65. <>
  66. {clientWidget}
  67. <DownloadSection />
  68. <Header></Header>
  69. <main id="maincontainer" className={"main-header pb-[.6rem]"}>
  70. {/*弹窗*/}
  71. <Suspense fallback={<Placeholder />}>{popupWidget}</Suspense>
  72. <Box>
  73. {/* swiper */}
  74. <Suspense fallback={<SwiperPlaceHolder />}>{swiperWidget}</Suspense>
  75. </Box>
  76. {/* swiper下的活动 */}
  77. <Box none className="px-[.12rem]">
  78. {cardWidget}
  79. </Box>
  80. {/* 跑马灯 */}
  81. <Box none className="px-[.12rem]">
  82. <Suspense fallback={<NoticePlaceHolder />}>{noticeWidget}</Suspense>
  83. </Box>
  84. {/* <Box>
  85. {categoryWidget}
  86. </Box> */}
  87. {/*体育轮播*/}
  88. {/* <Box> {sportSwiperWidget}</Box> */}
  89. {/* 搜索下面的大奖展示 */}
  90. <Suspense fallback={<PrizePlaceHolder />}>{prizeWidget}</Suspense>
  91. {/* 搜索组件 */}
  92. {/* <Box none className="mb-[.2rem] px-[.12rem]">
  93. {searchWidget}
  94. </Box> */}
  95. {/* tabs 和 游戏列表 */}
  96. <Suspense fallback={<PrizePlaceHolder />}>{children}</Suspense>
  97. {/*媒体*/}
  98. <Box none className="mt-[.2rem]">
  99. <Suspense fallback={<Placeholder />}>{mediaWidget}</Suspense>
  100. </Box>
  101. {/* {React.Children.map(children,(child:any)=>{
  102. console.log(child)
  103. return React.cloneElement(child,{sass:'asdasadsadsadasds'} )
  104. })} */}
  105. {/* {React.cloneElement(children,{group})} */}
  106. {/*底部信息*/}
  107. <Suspense fallback={<Placeholder />}>{actionWidget}</Suspense>
  108. </main>
  109. </>
  110. );
  111. };
  112. export default Layout;